const AppError = require('../utils/appError')
const Tag = require('../models/tag')
const Article = require('../models/article')
const catchAsync = require('../utils/catchAsync')

/**
 * 创建标签
 * 需要--拦截器中间(提前获取到user和token信息)，权限验证
 */
exports.addTag = catchAsync(async (req, res, next) => {
  const tag = new Tag(req.body)

  const savedTag = await tag.save()

  res.status(201).json({
    status: 'success',
    message: '标签创建成功',
    data: savedTag,
  })
})

/**
 * 获取标签列表（分页）
 */
exports.pageTag = catchAsync(async (req, res, next) => {
  const currentPage = +req.query.currentPage || 1
  const pageSize = +req.query.pageSize || 10
  const skip = (currentPage - 1) * pageSize

  // 不带任何筛选条件，只分页
  const [list, total] = await Promise.all([
    Tag.find().sort({ createdAt: -1 }).skip(skip).limit(pageSize),
    Tag.countDocuments(),
  ])

  res.status(200).json({
    status: 'success',
    data: {
      list,
      total,
      pageSize,
      currentPage,
    },
  })
})

/**
 * 根据 ID 获取单个标签
 */
exports.getTag = catchAsync(async (req, res, next) => {
  const tag = await Tag.findById(req.params.id)
  if (!tag) {
    return next(new AppError('标签不存在', 404))
  }

  res.status(200).json({
    status: 'success',
    data: tag,
  })
})

/**
 * 更新标签
 * 需要--拦截器中间(提前获取到user和token信息)，权限验证
 */
exports.updateTag = catchAsync(async (req, res, next) => {
  const tag = await Tag.findById(req.params.id)
  if (!tag) {
    return next(new AppError('标签不存在', 404))
  }

  Object.assign(tag, req.body)
  const updatedTag = await tag.save()

  res.status(200).json({
    status: 'success',
    message: '标签更新成功',
    data: updatedTag,
  })
})

/**
 * 删除标签
 * 需要--拦截器中间(提前获取到user和token信息)，权限验证
 */
exports.deleteTag = catchAsync(async (req, res, next) => {
  const tag = await Tag.findById(req.params.id)
  if (!tag) {
    return next(new AppError('标签不存在', 404))
  }

  const articleCount = await Article.countDocuments({ tags: tag._id })
  if (articleCount > 0) {
    return next(new AppError('该标签还被文章使用，无法删除', 400))
  }

  await Tag.findByIdAndDelete(req.params.id)

  res.status(200).json({
    status: 'success',
    message: '标签删除成功',
    data: null,
  })
})

/**
 * 获取所有标签（不分页，用于下拉选择等）
 */
exports.getAllTags = catchAsync(async (req, res, next) => {
  const tags = await Tag.find().sort({ name: 1 })

  res.status(200).json({
    status: 'success',
    data: tags,
  })
})
